\documentclass[a4paper,12pt,brazil,oneside]{book}

\input{header.tex}

\title{Título}

\begin{document}
\selectlanguage{brazil}

\include{capa}

\pagestyle{empty}

\clearpage

\selectlanguage{brazil}
\onehalfspace

\pagestyle{plain}
\pagenumbering{roman}

\chapter*{Sobre este documento}
\addcontentsline{toc}{chapter}{Sobre}
Os seguintes autores contribuíram para a elaboração deste material, a revisão indicada é a última realizada por cada um deles:
  \begin{itemize}
	\item Gabriela... \dotfill r?
  \end{itemize}
O código fonte do material, bem como de todos os exemplos usados, encontra-se disponível em \href{http://iot.dc.ufscar.br/}{http://iot.dc.ufscar.br/}.
\thispagestyle{empty}

\chapter*{Resumo}
\addcontentsline{toc}{chapter}{Resumo}

\begin{singlespace}
Esse material didático oferece uma visão geral de como programar para ...
O objetivo é fornecer noções sobre como utilizar as ferramentas ...
\end{singlespace}
\thispagestyle{empty}


\setcounter{tocdepth}{1} % 0 capítulos, 1 seções, 2 subseções
\tableofcontents
\thispagestyle{empty}

\listoffigures
\addcontentsline{toc}{chapter}{Lista de Figuras}
\thispagestyle{empty}

\listoftables
\addcontentsline{toc}{chapter}{Lista de Tabelas}
\thispagestyle{empty}

\listoflistings
\thispagestyle{empty}

%\chapter*{Lista de Abreviaturas}
%\addcontentsline{toc}{section}{Lista de Abreviaturas}
%\begin{longtable}{ll}
%\end{longtable}

\usemintedstyle{perldoc}

\thispagestyle{empty}

\doublespace
%\onehalfspace
%\singlespace

\pagestyle{body}
\pagenumbering{arabic}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\cha{introducao}{Introdução}
%\setcounter{page}{1}
%7-10p
O Android hoje está em centenas de milhões de dispositivos móveis ao redor do mundo, e vem crescendo. É uma plataforma para desenvolvimento em dispositivos móveis como \emph{smartphones}, \emph{tablets} e outros. 

Construído em uma colaboração \emph{open-source} com a comunidade de Linux, o Android se tornou a plataforma móvel mais utilizada e que mais cresce no mundo. Sua abertura o tornou o favorito de consumidores e desenvolvedores, levando a um rápido crescimento no número de aplicativos e jogos. Está disponível em centenas de dispositivos diferentes e de fabricantes diferentes em versões diferentes.

Atualmente\footnote{Data em que foi escrito: 04/2014} existem 5 principais versões do Android, são elas da mais atual para mais antiga:
\bi
\item \emph{KitKat} versão 4.4 que melhorou o gerenciamento de memória e reduziu o consumo, trazendo uma proteção agressiva da memória do sistema contra apps usando grandes quantidades de RAM além de introduzir uma nova interface.
\footnote{\emph{KitKat}: \href{http://developer.android.com/about/versions/kitkat.html}{http://developer.android.com/about/versions/kitkat.html}}
\item \emph{Jelly Bean} versão 4.1 à 4.3 que trouxe otimizações de performance, uma nova interface do sistema e outros
\footnote{\emph{Jelly Bean}: \href{http://developer.android.com/about/versions/jelly-bean.html}{http://developer.android.com/about/versions/jelly-bean.html}}
\item \emph{Ice Cream Sandwich} versão 4.0 trouxe uma interface refinada e unificada para \emph{smartphones} e \emph{tablets} além de facilidade com multitasking e outros
\footnote{\emph{Ice Cream Sandwich}: \href{http://developer.android.com/about/versions/android-4.0-highlights.html}{http://developer.android.com/about/versions/android-4.0-highlights.html}}
\item \emph{Honeycomb} versão 3.0 desenvolvida exclusivamente para \emph{tablets}
\footnote{\emph{Honeycomb}: \href{http://developer.android.com/about/versions/android-3.0-highlights.html}{http://developer.android.com/about/versions/android-3.0-highlights.html}}
\item \emph{Gingerbread} versão 2.3 introduziu refinamentos da interface, mais performance e tornou o sistema mais intuitivo
\footnote{\emph{Gingerbread}: \href{http://developer.android.com/about/versions/android-2.3-highlights.html}{http://developer.android.com/about/versions/android-2.3-highlights.html}}
\ei

O Google coletou os dados referentes a distribuição das versões do Android durante um período de 7 dias acabando em 1 de abril de 2014. Na \autoref{tab:distro} são apresentados os resultados obtidos, cuja proporção pode ser observada na \autoref{fig:dist}. Como esses dados são adquiridos por meio do novo aplicativo da Play Store, o qual dá apenas suporte para o Android 2.2 e superior, versões mais antigas não estão inclusas. Todavia, em Agosto de 2013, versões mais antigas que o Android 2.2 somavam um total de 1\% dos dispositivos que logaram nos servidores da Google.


\begin{table}[htb!]
  \centering
    \label{tab:distro}
    \caption{Distribuição das versões do Android em 1 de abril de 2014.}
    \begin{tabular}{llcr}
     \rowcolor{Gray} \hline 
    Versão        & Codinome           & API & Distribuição \\ \hline \hline
    2.2           & Froyo              & 8   & 1.1\%        \\ 
    2.3.3 - 2.3.7 & Gingerbread        & 10  & 17.8\%       \\ 
    3.2           & Honeycomb          & 13  & 0.1\%        \\ 
    4.0.3 - 4.0.4 & Ice Cream Sandwich & 15  & 14.3\%       \\ 
    4.1.x         & Jelly Bean         & 16  & 34.4\%       \\ 
    4.2.x         & Jelly Bean         & 17  & 18.1\%        \\
    4.3         & Jelly Bean         & 18  & 8.9\%        \\ 
    4.4         & KitKat        & 19  & 5.3\%        \\ \hline
    \end{tabular}
    % REITRADO DE: http://developer.android.com/about/dashboards/index.html
\end{table}

Você pode configurar a versão do SDK manualmente modificando os valores no \emph{manifest}. Como mostrado no exemplo abaixo:

\begin{singlespace}
\begin{listing}[H]
\inputminted[linenos=true,fontsize=\small,frame=lines, framesep=2mm, tabsize=2,numbersep=5pt]{xml}{../src/firstapp/sdk-manifest.xml}
\label{AndroidManifest.sdk}
\caption{Exemplo de configuração de versão do SDK no arquivo \texttt{AndroidManifest.xml} }
\end{listing}
\end{singlespace}

Esse material irá cobrir alguns tópicos no desenvolvimento de aplicativos para Android, tais como:
\bi
  \item Configuração do ambiente de desenvolvimento: Como configurar o ambiente para começar a desenvolver aplicativos, os primeiros passos para criar seu primeiro aplicativo de maneira simples;
  \item Elementos da interface: Como projetar seu aplicativo para usar as principais interfaces. Listas, Listas compostas, Grades, Abas, Menus são as interfaces mais usadas nos diversos aplicativos no mercado; e
  \item Elementos de hardware: Como projetar seu aplicativo para usar as APIs de hardware: Bluetooth, GPS, SMS, Chamadas.
\ei

Para esse material, algumas convenções serão seguidas: 
\bi
  \item Os códigos estarão sempre com a sintaxe colorida para facilitar a leitura;
  \item URLs das referências estarão nas notas de rodapé; e
  \item Dicas estarão envoltas por uma caixa para facilitar a visualização.
\ei

% http://tug.ctan.org/tex-archive/macros/latex/contrib/minted/
% http://pygments.org/

\cha{configambiente}{Configuração do Ambiente}
A instalação e configuração do ambiente de desenvolvimento para Android é simples, o Google fornece um pacote chamado ADT \emph{(Android Development Tools)} que contém o ambiente Eclipse com o \emph{plugin} do Android, algumas ferramentas para instalação dos aplicativos nos \emph{smartphones}, o gerenciador do SDK e as imagens para o emulador do Android. Essas ferramentas são suficientes para o desenvolvimento na plataforma.
O pacote ADT pode ser encontrado em: \href{http://developer.android.com/sdk/}{Android SDK}\footnote{\href{http://developer.android.com/sdk/}{http://developer.android.com/sdk/}}. 

Basta fazer o download do pacote e extrair que tudo já está pré-configurado para iniciar o desenvolvimento, portanto não há muito o que configurar.

Caso opte por utilizar uma instalação já existente do ambiente Eclipse, você pode instalar o plugin do Android automaticamente através da ferramenta de instalação de plugins do ambiente. Após a instalação será necessário abrir o \emph{SDK Manager} e instalar:
\begin{itemize}[noitemsep, nolistsep]
\item \emph{Android SDK Tools};
\item \emph{Android SDK Platform-Tools}; e
\item Para cada API que você irá utilizar, instalar o \emph{SDK Platform} e opcionalmente o \emph{Documentation for Android SDK} e o \emph{Samples for SDK}.
\end{itemize}

\cha{intro-android}{Linguagem do Android}
\section{Linguagem}
A linguagem usada para programar na plataforma Android é Java. Então, antes de engajar no aprendizado Android é recomendável estudar algum material sobre Java e principalmente o paradigma de orientação a objetos.

O Android tem algumas particularidades na organização e configuração que é feita através de arquivos XML específicos do Android. Alguns arquivos XML servem para configurar o aplicativo, layout de cada tela e outros dão suporte a strings para facilitar o suporte a múltiplos idiomas. Felizmente o conjunto Eclipse com ADT já cuida disso automaticamente e possui uma série de facilidades alcançadas por meio de interfaces gráficas para os programadores. Por esse motivo, para qualquer iniciante nessa área é recomendável a utilização do ambiente Eclipse.

A criação de layouts dos aplicativos pode ser feita inteiramente através da interface gráfica disponível no ambiente, no estilo \textit{drag and drop}. 

\section{Entendendo a estrutura de uma aplicação Android}

Uma aplicação Android consiste de uma ou mais \emph{activities}. Uma \emph{activity} é uma tela com \emph{views} que interagem com o usuário. Como o Android segue o padrão MVC \emph{(Model-View-Control)} as \emph{activities} são os \emph{controllers} e as \emph{views}, \emph{views}. As \emph{activities} são classes do Java, o \emph{layout} e outros recursos são definidos em arquivos XML.

Dentre os diversos arquivos XML existentes na configuração de um aplicativo Android o mais importante é o \texttt{{AndroidManifest.xml}}
\footnote{Documentação do \texttt{AndroidManifest}: \href{The AndroidManifest.xml File}{http://developer.android.com/guide/topics/manifest/manifest-intro.html}}
 pois é nele que se exprimem as configurações gerais do aplicativo. Nesse texto não iremos adentrar muito nos detalhes das configurações, mas apenas deixar claro que é nesse arquivo que se colocam as versões do Android que seu aplicativo será compatível com, as permissões para usar os recursos do aparelho como Internet, GPS, Bluetooth, etc. 
 
 A pasta \texttt{src/} contém o pacote com as classes do seu aplicativo isto é, o código fonte do seu aplicativo. Tanto \emph{activites} como classes de suporte devem estar dentro do pacote.

Dentro da pasta \texttt{res/} de recursos, encontram-se outros arquivos, referentes à disposição do layout, valores de strings e imagens que sua aplicação irá utilizar. A pasta \texttt{layout/} junto com as pastas \texttt{drawable/} servem para dispor o layout. Cada \textit{drawable} comporta imagens para um tamanho diferente de tela, enquanto que a pasta de \textit{layout} contém a disposição geral do layout. São nesses arquivos que se colocam os itens \emph{(views)} que irão nas telas, como botões, caixas de texto, caixas de seleção, etc.

Na pasta \texttt{values/} o mais importante é o arquivo \texttt{strings.xml} que contém os valores das strings do aplicativo. Sempre que você quiser referenciar alguma string, a mesma deverá estar expressa nesse arquivo. Fica fácil dessa forma fazer o aplicativo suportar múltiplos idiomas, pois basta traduzir esse único arquivo para alterar todos os textos do aplicativo.

A pasta \texttt{menu/} contém os \emph{layouts} do menus do aplicativo, esses são aqueles que podem ser acessados através da \emph{Action Bar}\footnote{\emph{ActionBar}: \href{http://developer.android.com/design/patterns/actionbar.html}{http://developer.android.com/design/patterns/actionbar.html}} ou através dos botões físicos do aparelho.
\section{Alguns arquivos importantes:}

\textbf{/res/layout/activity\_main.xml:}

O arquivo \emph{activity\_main.xml} localizado na pasta \emph{layout} define a interface gráfica da tela. Por padrão, ao criar o projeto esse arquivo contém uma tag \emph{<TextView>} para exibir um simples texto na tela. Essa tag define o atributo \emph{android:text="\@string/hello"}, que utiliza uma mensagem identificada pela chave hello localizada no arquivo \emph{strings.xml}.

\textbf{/res/values/strings.xml:}

O arquivo \emph{strings.xml} localizado na pasta \emph{values} contém as mensagens da aplicação para organizar os textos em um único arquivo centralizado, o que é uma boa prática de programação. Desta forma podemos facilmente traduzir este arquivo para diversos idiomas e tornar nossa aplicação bastante internacionalizáveis.
Por padrão, esse arquivo contém o nome da aplicação que digitamos ao criar o projeto e a mensagem que aparece na tela principal definida pelo arquivo \emph{main.xml}.
O nome da aplicação é definido pela chave \emph{app\_name}, e o texto que aparece na tela é definido pela chave \emph{hello}.  O padrão para acessar essas mensagens é @string/nomeDaChave.
Se for necessário mais de um idioma no aplicativo, basta criar uma pasta /res/values/values-(código do idioma) e traduzir o arquivo \emph{strings.xml} desta pasta.

\textbf{R.java:}

A classe \emph{R} tem constantes para facilitar acesso aos recursos do projeto, como por exemplo, um arquivo XML que define uma tela ou uma imagem localizada na pasta \emph{drawable}.
Sempre que um recurso é adicionado no projeto, como por exemplo, uma nova imagem, essa classe é gerada automaticamente pelo Eclipse para conter uma constante para o novo recurso criado. \textbf{Nunca altera a classe R manualmente!} 

\textbf{MainActivity.java:}

Esta é a classe principal do projeto e representa a tela inicial da aplicação. Observe que essa classe é filha de \emph{android.app.Activity}.
A classe \emph{android.app.Activity} representa uma tela da aplicação e é responsável por controlar o estado e os eventos da tela. Assim, para cada tela da aplicação você criará uma classe-filha de \emph{Activity}. O método \emph{onCreate(bundle)} precisa ser implementado obrigatoriamente e é chamado de forma automática pelo Android quando a tela é criada. No entanto, a classe \emph{android.app.Activity} não sabe desenhar nada na tela e para isso precisa da ajuda da classe \emph{android.view.View} que, por sua vez, se encarrega de desenhar os componentes visuais, como campos de texto, botões e imagens. Para isso, existem diversas subclasses especializadas de \emph{android.view.View}.


\textbf{AndroidManifest.xml:}

O arquivo \emph{AndroidManifest.xml} é o arquivo principal do projeto e centraliza as configurações da aplicação. Note que existe, no arquivo xml a tag \emph{uses-sdk} a qual é utilizada para informar o level mínimo da API exigido pela aplicação. Por exemplo, uma aplicação pode ser compatível com a API level 8 mas otimizado para a 19, isto é, o Android 4.4: \emph{<uses-sdk android:minSdkVersion="8"   android:targetSkdVersion="19"  />}



\newpage
\textbf{Resumindo:}
\begin{itemize}[noitemsep, nolistsep]
\item \texttt{AndroidManifest.xml}: Configurações gerais do aplicativo;
\item \texttt{src/}: Classes do aplicativo; e
\item \texttt{res/}: Recursos do aplicativo tais que:
	\begin{itemize}[nolistsep, noitemsep]
		\item \texttt{strings/}: Todos os textos da sua aplicação, suporte a múltiplos idiomas;	
		\item \texttt{layout/}: Todos os \emph{layouts} de suas telas \emph{(activites)};
		\item \texttt{drawable/}: Todas as imagens, separados por tamanho de tela; e
		\item \texttt{menu/}: \emph{layout} dos menus do aplicativo.
	\end{itemize}
\end{itemize}


%% FIRST APP %%
\cha{primeiro-aplicativo}{Criando seu primeiro aplicativo}
Para exemplificar a criação de um aplicativo, seguiremos o exemplo dado pelo próprio manual do Google sobre o Android 
(Ver original\footnote{Original em: \href{http://developer.android.com/training/basics/firstapp/creating-project.html}{http://developer.android.com/training/basics/firstapp/creating-project.html}}). 
Trata-se de aplicativo simples do tipo \emph{''Hello World''}.

Iniciaremos criando um novo projeto no Eclipse acessando o menu: \emph{File -> New -> Android Application Project}.

Na janela que apareceu você deve colocar o nome do aplicativo, do projeto e do pacote. O nome do pacote deve seguir a convenção do Java\footnote{Convenção sobre nome dos pacotes: \href{http://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html}{http://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html}}.
\begin{itemize}[noitemsep]
	\item \textit{Minimum Required SDK:} É a versão mínima do sistema operacional Android que sua aplicação irá suportar, o mais comum é a versão 8 do SDK que se refere ao Android 2.2. Alguns tipos de layouts mais complexos não são suportados em versões mais antigas;
	\item \textit{Target SDK:} É a versão principal do Android para qual seu aplicativo está sendo desenvolvido;
	\item \textit{Compile With:} Versão do Android com qual seu aplicativo será compilado; e
	\item \textit{Theme:} Cores do layout.
\end{itemize}

Observe na \autoref{fig:newapp1} a janela de criação de uma nova aplicação Android. Em \emph{Application Name} você deve colocar o nome do aplicativo, em \emph{Project Name}, o nome do projeto e em \emph{Package Name} o nome do pacote. Para esse exemplo utilizaremos como \emph{Minimum Required SDK} a versão API 8, já que nesse exemplo não usaremos nenhum layout que não é suportado em versões mais antigas. Em \emph{Target SDK} e \emph{Compile With} optaremos pela versão mais nova, a API 17. Por final o \emph{Theme} eu optei pelo \emph{Holo Light with Dark Action Bar} que é um tema com fundo branco e barra superior preta, um dos padrões do Android.

\begin{framed}
\textbf{Dica:} Para obter o máximo de compatibilidade sempre procure utilizar \emph{layouts} compatíveis com versões antigas, observe na \autoref{fig:dist} que versões antigas ainda tem uma fatia considerável do mercado.
\end{framed}

\begin{figure}[htb!]
  \centering
  \label{fig:newapp1}
  \includegraphics[width=.75\textwidth]{../figuras/criandoapp1}
  \caption{Primeira janela de criação de novo aplicativo}
\end{figure}

\singlespace
\selectlanguage{brazil}
\clearpage
\thispagestyle{empty}
\phantomsection
\doublespace



\end{document}
